package day12;

import javax.sound.midi.Soundbank;
import java.security.spec.RSAOtherPrimeInfo;
import java.sql.SQLOutput;
import java.util.Objects;

//此类是用于验证Object的测似乎DEMO
public class TestObject {
    public static void main(String[] args) {
        //3创建对象
        Student s = new Student();
        Student s1 = new Student("我是海绵宝宝" , 3);
        Student s2 = new Student("我是海绵宝宝" , 3);
        //4hashcode()方法验证
        //hashcode方法没有在Student中定义它可以是因为Student继承了Object类
        //所以直接调用，每个对象的哈希码值不同，极少数情况相同称为hash碰撞
        System.out.println(s.hashCode());
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());

        //5测试toString方法
        System.out.println(s);
        System.out.println(s1);
        System.out.println(s2);

        //测试euqals
        /*Object中equal默认实现1功能是比较
        * ==比较左右两边的值，如果是基本类型比较的就是字面值，比如12，2，3，4
        * 如果是引用类型，比较的是引用类型变量保存的地址值
        * 如果子类重写了equals和hashCode以后，比较的就是对象的类型+属性+属性值*/
        System.out.println(s1.equals(s2));   //false
        System.out.println(s1.equals(s));    //false
    }
}


//1c创建一个名为Student的类，这个类自动继承object
class Student{
    String name;
    int age;

    //2。创建构造方法
    public Student() {
    }
    //重写equals（）方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
    //重写hashCode()方法
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("我是全参构造“");


    }
}